package cn.iocoder.yudao.module.picturebook.utils;

import java.io.SequenceInputStream;
import javax.sound.sampled.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections; // 新增这行
public class Jdk8AudioMergeUtils {

    /**
     * 合并音频为 WAV（Java 原生支持，无任何额外依赖）
     *
     * @param inputFilePaths 输入音频路径列表（支持 MP3/WAV，自动转换）
     * @param outputFilePath 输出 WAV 文件路径
     */
    public static void mergeAudiosToWav(List<String> inputFilePaths, String outputFilePath) throws Exception {
        List<AudioInputStream> audioStreams = new ArrayList<>();
        AudioFormat targetFormat = null;

        try {
            // 1. 读取并转换所有音频流
            for (String path : inputFilePaths) {
                File file = new File(path);
                AudioInputStream originalStream = AudioSystem.getAudioInputStream(file);

                // 初始化目标格式（以第一个文件为准）
                if (targetFormat == null) {
                    targetFormat = getTargetFormat(originalStream.getFormat());
                }

                // 转换为统一格式
                AudioInputStream convertedStream = convertToFormat(originalStream, targetFormat);
                audioStreams.add(convertedStream);

                // 关闭原始流（避免资源泄漏）
                originalStream.close();
            }

            // 2. 合并音频流
            AudioInputStream mergedStream = null;
            if (targetFormat != null) {
                mergedStream = new AudioInputStream(
                        new SequenceInputStream(Collections.enumeration(audioStreams)),
                        targetFormat,
                        calculateTotalFrames(audioStreams)
                );
            }

            // 3. 写入 WAV 文件（Java 原生支持）
            File outputFile = new File(outputFilePath);
            if (!outputFile.getParentFile().exists()) {
                outputFile.getParentFile().mkdirs();
            }
            AudioSystem.write(mergedStream, AudioFileFormat.Type.WAVE, outputFile);

        } finally {
            // 4. 关闭所有流
            for (AudioInputStream stream : audioStreams) {
                stream.close();
            }
        }
    }

    // 计算总帧数（合并用）
    private static long calculateTotalFrames(List<AudioInputStream> streams) {
        long total = 0;
        for (AudioInputStream stream : streams) {
            total += stream.getFrameLength();
        }
        return total;
    }

    // 定义目标格式（PCM 编码，Java 原生支持）
    private static AudioFormat getTargetFormat(AudioFormat sourceFormat) {
        return new AudioFormat(
                AudioFormat.Encoding.PCM_SIGNED,
                sourceFormat.getSampleRate(),
                16,
                sourceFormat.getChannels(),
                sourceFormat.getChannels() * 2,
                sourceFormat.getSampleRate(),
                false
        );
    }

    // 转换音频格式
    private static AudioInputStream convertToFormat(AudioInputStream sourceStream, AudioFormat targetFormat) {
        if (sourceStream.getFormat().matches(targetFormat)) {
            return sourceStream;
        }
        return AudioSystem.getAudioInputStream(targetFormat, sourceStream);
    }
}